package com.wy.materialdesign.customBehavior;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;

import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.view.ViewCompat;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.wy.materialdesign.R;

/**
 * description: FloatingActionButton 位移的自定义 Behavior
 * author: Darren on 2017/7/4 14:36
 * email: 240336124@qq.com
 * version: 1.0
 */
public class TranslationBehavior extends FloatingActionButton.Behavior {


    private String TAG = "TranslationBehavior";

    /**
     * 当前是否是显示状态
     */
    private boolean mIsShow = false;

    private LinearLayout mBottomTabView;

    public TranslationBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 摆放子 View 的时候调用
     */
    @Override
    public boolean onLayoutChild(CoordinatorLayout parent, FloatingActionButton child, int layoutDirection) {
        mBottomTabView = parent.findViewById(R.id.bottom_tab_layout);
        return super.onLayoutChild(parent, child, layoutDirection);
    }

    /**
     * 当coordinatorLayout 的子View试图开始嵌套滑动的时候被调用。当返回值为true的时候表明
     * coordinatorLayout 充当nested scroll parent 处理这次滑动，需要注意的是只有当返回值为true
     * 的时候，Behavior 才能收到后面的一些nested scroll 事件回调（如：onNestedPreScroll、onNestedScroll等）
     * 这个方法有个重要的参数nestedScrollAxes，表明处理的滑动的方向。
     *
     * @param coordinatorLayout 和Behavior 绑定的View的父CoordinatorLayout
     * @param child             和Behavior 绑定的View
     * @param directTargetChild
     * @param target
     * @param nestedScrollAxes  嵌套滑动 应用的滑动方向，看 {@link ViewCompat#SCROLL_AXIS_HORIZONTAL},
     *                          {@link ViewCompat#SCROLL_AXIS_VERTICAL}
     * @return
     */
    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) {
        // nestedScrollAxes 滑动关联的轴，我们只关心垂直的滑动
        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
    }

    /**
     * 进行嵌套滚动时被调用
     *
     * @param coordinatorLayout
     * @param child
     * @param target
     * @param dxConsumed        target 已经消费的x方向的距离
     * @param dyConsumed        target 已经消费的y方向的距离
     * @param dxUnconsumed      x 方向剩下的滚动距离
     * @param dyUnconsumed      y 方向剩下的滚动距离
     */
    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);

        Log.i(TAG, "dyConsumed:" + dyConsumed + ",mIsShow:" + mIsShow);

        // 根据情况执行动画 一个显示 一个是影藏
        if (dyConsumed > 0) {
            if (!mIsShow) {
                CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) child.getLayoutParams();
                child.animate().translationY(params.bottomMargin + child.getMeasuredHeight()).setDuration(400).start();
                // 处理底部位移动画
                mBottomTabView.animate().translationY(mBottomTabView.getMeasuredHeight()).setDuration(300).start();
                mIsShow = !mIsShow;
            }
        }

        if (dyConsumed < 0) {
            if (mIsShow) {
                child.animate().translationY(0).setDuration(400).start();
                // 处理底部位移动画
                mBottomTabView.animate().translationY(0).setDuration(200).start();
                mIsShow = !mIsShow;
            }
        }

    }

}